package ar.uba.fi.taller2.cmmiassistant.frontend.adaptadores.tabla;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import ar.uba.fi.taller2.cmmiassistant.controlador.Controlador;
import ar.uba.fi.taller2.cmmiassistant.modelo.evaluacion.Evaluacion;
import ar.uba.fi.taller2.cmmiassistant.modelo.evaluacion.Instancia;
import ar.uba.fi.taller2.cmmiassistant.modelo.evidencias.Asociacion;
import ar.uba.fi.taller2.cmmiassistant.modelo.evidencias.Evidencia;
import ar.uba.fi.taller2.cmmiassistant.observador.Observable;
import ar.uba.fi.taller2.cmmiassistant.observador.Observador;
import ar.uba.fi.taller2.cmmiassistant.observador.ServicioNotificacion;

public class TableModelInstancias extends TableModelBeanAdapter {

    private static final long serialVersionUID = -3705110358394627322L;

    private Controlador controlador;

    private Instancia[] instancias = new Instancia[0];

    public TableModelInstancias() {

        super(Instancia.class, "idInstancia", "nombre", "descripcion");
    }

    public int getRowCount() {
        return this.getInstancias().length;
    }

    public Object getValueAt(int fila, int columna) {
        return this.getValueAt(this.getInstancias()[fila], columna);
    }

    public Instancia getInstancia(int fila) {

        return this.getInstancias()[fila];
    }

    public Instancia[] getInstancias(List<Integer> filas) {

        List<Instancia> seleccionadas = new ArrayList<Instancia>();

        for (Integer fila : filas) {

            seleccionadas.add(this.getInstancia(fila));
        }

        return seleccionadas.toArray(new Instancia[seleccionadas.size()]);
    }

    protected Instancia[] getInstancias() {
        return this.instancias;
    }

    protected void setInstancias(Instancia[] instancias) {
        this.instancias = instancias;
    }

    protected void setInstancias(Collection<Instancia> instancias) {

        this
                .setInstancias(instancias.toArray(new Instancia[instancias
                        .size()]));
    }

    public void setControlador(Controlador controlador) {

        this.controlador = controlador;

        ServicioNotificacion.addObservador(this.getControlador().getModelo()
                .getEvaluacionSeleccionada(), this.observadorModelo);

        this.cargar();
    }

    private void cargar() {

        Evaluacion evaluacion = this.getControlador().getModelo()
                .getEvaluacionSeleccionada().getValor();

        if (evaluacion != null) {
            this.setInstancias(evaluacion.getInstancias());
        }
    }

    private Controlador getControlador() {
        return this.controlador;
    }

    private final Observador observadorModelo = new Observador() {

        public void cambio(Observable entidad) {

            TableModelInstancias.this.cargar();
            TableModelInstancias.this.fireTableDataChanged();
        }
    };
}
